package com.wxb.quartz.service.impl;

import com.alibaba.druid.util.StringUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.*;
import com.alipay.api.response.*;
import com.wxb.quartz.alipay.AlipayCode;
import com.wxb.quartz.alipay.TradePrecreate;
import com.wxb.quartz.model.PayRecord;
import com.wxb.quartz.service.AlipayService;
import com.wxb.quartz.service.PayRecordService;
import com.wxb.quartz.util.DateUtils;
import com.wxb.quartz.util.RandomUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.Date;

/**
 * describe:
 *
 * @author : 王校兵
 * @version : v1.0
 * @time : 2017/6/20  11:18
 */
@Service
public class AlipayServiceImpl implements AlipayService {

    @Autowired
    private PayRecordService service;


    /**
     * 交易查询接口
     * case:
     * 该接口提供所有支付宝支付订单的查询，商户可以通过该接口主动查询订单状态，完成下一步的业务逻辑。
     * 需要调用查询接口的情况： 当商户后台、网络、服务器等出现异常，商户系统最终未接收到支付通知； 调用支付接口后，返回系统错误或未知交易状态情况；
     * 调用alipay.trade.pay，返回INPROCESS的状态； 调用alipay.trade.cancel之前，需确认支付状态；
     * <p/>
     * json字符串,字符串包含参数（tips 所有的参数名必须与下述相同）
     * out_trade_no	String	特殊可选	订单支付时传入的商户订单号,和支付宝交易号不能同时为空。trade_no,out_trade_no如果同时存在优先取trade_no
     * trade_no	String	特殊可选	支付宝交易号，和商户订单号不能同时为空
     */
    @Override
    public String orderQuery(String out_trade_no) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("out_trade_no", out_trade_no);

        //1、获得初始化的AlipayClient并且设置各种请求参数
        AlipayClient alipayClient = getAlipayClient();

        //2、设置请求参数
        AlipayTradeQueryRequest alipayRequest = new AlipayTradeQueryRequest();
        alipayRequest.setBizContent(jsonObject.toJSONString());

        //3、请求
        String result = null;
        try {
            result = alipayClient.execute(alipayRequest).getBody();
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }

        //返回结果
        return result;
    }


    /**
     * 封装AlipayClient
     */
    private static AlipayClient getAlipayClient() {
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayCode.URL, AlipayCode.APP_ID, AlipayCode.APP_PRIVATE_KEY,
                AlipayCode.FORMAT, AlipayCode.CHARSET_UTF, AlipayCode.ALIPAY_PUBLIC_KEY, AlipayCode.SIGN_TYPE);
        return alipayClient;
    }
}
